package com.ysx.service.Impl;

import com.ysx.dao.MessageDao;
import com.ysx.entity.Comment;
import com.ysx.entity.Mail;
import com.ysx.entity.Message;
import com.ysx.entity.User;
import com.ysx.service.MessageService;
import com.ysx.utils.MailUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import javax.annotation.Resource;
import javax.mail.MessagingException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * @Description: 留言业务层接口实现类
 */
@Service
public class MessageServiceImpl implements MessageService {

    @Resource
    private MessageDao messageDao;

    @Autowired
    private MailUtil mailUtil;


    //存放迭代找出的所有子代的集合
    private List<Message> tempReplys = new ArrayList<>();

    /**
     * @Description: 查询留言
     * @Param:
     * @Return: 留言消息
     */
    @Override
    // @Cacheable(value = "messageList",key = "'message'")
    public List<Message> listMessage() {
        //查询出父节点
        List<Message> messages = messageDao.findByParentIdNull(Long.parseLong("-1"));
        for (Message message : messages) {
            Long id = message.getId();
            String parentNickname1 = message.getNickname();
            List<Message> childMessages = messageDao.findByParentIdNotNull(id);

            //查询出子留言
            combineChildren(childMessages, parentNickname1);
            message.setReplyMessages(tempReplys);
            tempReplys = new ArrayList<>();
        }
        return messages;
    }

    /**
     * @Description: 查询出子留言
     * @Param: childMessages：所有子留言
     * @Param: parentNickname1：父留言的姓名
     * @Return:
     */
    private void combineChildren(List<Message> childMessages, String parentNickname1) {
        //判断是否有一级子回复
        if (childMessages.size() > 0) {
            //循环找出子留言的id
            for (Message childMessage : childMessages) {
                String parentNickname = childMessage.getNickname();
                childMessage.setParentNickname(parentNickname1);
                tempReplys.add(childMessage);
                Long childId = childMessage.getId();
                //查询二级以及所有子集回复
                recursively(childId, parentNickname);
            }
        }
    }

    /**
     * @Description: 循环迭代找出子集回复
     * @Param: childId：子留言的id
     * @Param: parentNickname1：子留言的姓名
     * @Return:
     */
    private void recursively(Long childId, String parentNickname1) {
        //根据子一级留言的id找到子二级留言
        List<Message> replayMessages = messageDao.findByReplayId(childId);

        if (replayMessages.size() > 0) {
            for (Message replayMessage : replayMessages) {
                String parentNickname = replayMessage.getNickname();
                replayMessage.setParentNickname(parentNickname1);
                Long replayId = replayMessage.getId();
                tempReplys.add(replayMessage);
                //循环迭代找出子集回复
                recursively(replayId, parentNickname);
            }
        }
    }

    @Override
    //存储留言信息
    public int saveMessage(Message message, Message parentMessage) {
        message.setCreateTime(new Date());


        return  messageDao.saveMessage(message);
    }

    //    删除留言
    @Override
    public void deleteMessage(Long id) {
        messageDao.deleteMessage(id);
    }

    @Override
    public Message getEmailByParentId(Long parentId) {
        return messageDao.getEmailByParentId(parentId);
    }

    @Override
    public void sendMail(User user, Message message) throws MessagingException {
        if (user != null) {
            //如果是管理员发的评论
            if (message.getParentMessage().getId() == null) {
                //如果是根评论
                //不需要发给自己邮件
                return;
            } else {
                //如果不是根评论，则给[我回复的对象]发一封提醒邮件
                Message parentMessage = messageDao.getEmailByParentId(message.getParentMessage().getId());//获取父评论

                Mail mail = new Mail(null, parentMessage.getEmail(), parentMessage.getNickname(), parentMessage.getContent(),
                        message.getNickname(), message.getContent(),
                        "/message", "您在《XiaoYang的客栈-留言板》中的评论有了新的回复！");
                mailUtil.sendThymeleafEmail(mail);
            }
        } else {
            //如果不是管理员发的评论
            if (message.getParentMessage().getId() == -1) {
                //如果是根评论
                //发给我自己，提醒有人在留言板留言了
                Mail mail = new Mail(null, "983022332@qq.com", "小杨博主", null,
                        message.getNickname(), message.getContent(),
                        "/message", "在《XiaoYang的客栈-留言板》中你有了新的留言！");

                mailUtil.sendThymeleafEmail(mail);

            }
        }
    }
}